package block

import (
	"bytes"
	"encoding/gob"
	log "github.com/corgi-kx/logcustom"
)

type BlockHeader struct {
	//0 上一个区块的hash
	PreHash []byte
	//上一个区块的幻方
	PreRandomMatrix RandomMatrix
	//1 FIXME 当前Block的Merkel根的W重计算值,首先设置为 []byte
	MerkelRootHash  []byte
	MerkelRootWHash []byte
	//2 FIXME W重计算值的数字签名（由挖矿人签名）
	MerkelRootWSignature []byte
	//3 FIXME CA证书
	CA CACertificate
	//4 FIXME 对用户节点的激励（激励金额由计算节点决定）
	TransactionToUser Transaction
	//5 难度值
	Difficulty []byte
	//时间戳
	TimeStamp int64
	//区块高度
	Height int
	//FIXME 随机幻方
	RandomMatrix RandomMatrix
	//Nonce int64
	//本区块hash = Hash（PreHash + MerkelRootHash + MerkelRootSignature + CA + Transaction(计算节点会对激励验证) +
	// TimeStamp + Height + NBits + RandomMatrix）< 难度
	Hash []byte
}

type Block struct {
	//区块头
	BBlockHeader BlockHeader
	//数据data 当云计算节点收集交易时，
	//第1笔交易是输入为空，输入为给打包该区块的云计算节点的激励
	Transactions []Transaction
}

//// 将Block对象序列化成[]byte
func (b *Block) Serialize() []byte {
	var result bytes.Buffer
	encoder := gob.NewEncoder(&result)

	err := encoder.Encode(b)
	if err != nil {
		panic(err)
	}
	return result.Bytes()
}

func (v *Block) Deserialize(d []byte) {
	decoder := gob.NewDecoder(bytes.NewReader(d))
	err := decoder.Decode(v)
	if err != nil {
		log.Panic(err)
	}
}

//blockHeader序列化
func SerializeBlockHeader(bh *BlockHeader) []byte {
	var result bytes.Buffer
	encoder := gob.NewEncoder(&result)

	err := encoder.Encode(bh)
	if err != nil {
		panic(err)
	}
	return result.Bytes()
}

//blockHeader反序列化
func DeserializeBlockHeader(d []byte) *BlockHeader {
	var bh BlockHeader
	decoder := gob.NewDecoder(bytes.NewReader(d))
	err := decoder.Decode(&bh)
	if err != nil {
		log.Panic(err)
	}
	return &bh
}
